#!/bin/bash

DATA_FILE="tmp.csv"
TEMP_EDIT_FILE="tmp_edit.csv"

# 检查数据文件是否存在，如果不存在则引导用户运行导入脚本
if [ ! -f "$DATA_FILE" ]; then
    echo "错误: 数据文件 '$DATA_FILE' 不存在。"
    echo "请先运行 './import.sh' 脚本导入初始数据。"
    exit 1
fi

# 读取表头并动态确定关键列的列号
IFS=',' read -r -a HEADERS < <(head -n 1 "$DATA_FILE")
ID_COL=-1
NAME_COL=-1
SUBJECT_START_COL=-1

for i in "${!HEADERS[@]}"; do
    header_name=$(echo "${HEADERS[$i]}" | tr -d '\r') # 移除可能存在的回车符
    # 精确匹配"学号"和"姓名"
    if [[ "$header_name" == "学号" ]]; then
        ID_COL=$((i + 1))
    elif [[ "$header_name" == "姓名" ]]; then
        NAME_COL=$((i + 1))
    # 假设“姓名”列之后的所有列都是科目成绩
    elif [[ "$NAME_COL" -ne -1 && "$SUBJECT_START_COL" -eq -1 ]]; then
        SUBJECT_START_COL=$((i + 1))
    fi
done

if [[ "$ID_COL" -eq -1 || "$NAME_COL" -eq -1 || "$SUBJECT_START_COL" -eq -1 ]]; then
    echo "错误：无法在 '$DATA_FILE' 中找到'学号'或'姓名'列，或无法确定成绩起始列。"
    exit 1
fi

# 辅助函数：将文字等级转换为数字成绩用于计算
grade_to_numeric() {
    local grade_str="$1"
    case "$grade_str" in
        "优秀"|优) echo 95 ;;
        "良好"|良) echo 85 ;;
        "中等"|中) echo 75 ;;
        "及格"|及) echo 65 ;;
        "不及格") echo 55 ;;
        *)
            if [[ "$grade_str" =~ ^[0-9]+(\.[0-9]+)?$ ]]; then
                echo "$grade_str"
            else
                echo 0 # 无法识别的或空字符串计为0分
            fi
            ;;
    esac
}

# 1. 添加成绩信息
add_grade() {
    echo "--- 添加新的学生成绩 ---"
    local new_record_array=()
    local input_val
    read -p "请输入 $(echo ${HEADERS[$((ID_COL-1))]} | tr -d '\r'): " input_val
    if grep -q "^${input_val}," "$DATA_FILE"; then
        echo "错误：学号 '$input_val' 已存在。"
        return
    fi
    new_record_array+=("$input_val")

    # 从姓名列开始循环到最后一列
    for (( i=NAME_COL-1; i<${#HEADERS[@]}; i++ )); do
        # 清理表头中的学分信息 [N] 以便提示
        clean_header=$(echo "${HEADERS[$i]}" | sed 's/ *\[.*\]//' | tr -d '\r')
        read -p "请输入 '${clean_header}': " input_val
        new_record_array+=("$input_val")
    done

    new_record_line=$(IFS=,; echo "${new_record_array[*]}")
    echo "$new_record_line" >> "$DATA_FILE"
    echo "成绩添加成功！"
}

# 删除成绩信息
delete_grade() {
    echo "--- 删除学生成绩 ---"
    read -p "请输入要删除学生的学号: " student_id
    # 使用 awk 来精确定位学号列
    if ! awk -F, -v id_col="$ID_COL" -v id="$student_id" '$id_col == id {found=1; exit} END{exit !found}' "$DATA_FILE"; then
        echo "错误：未找到学号为 '$student_id' 的学生。"
        return
    fi
    awk -F, -v id_col="$ID_COL" -v id="$student_id" '$id_col != id' "$DATA_FILE" > "$TEMP_EDIT_FILE"
    # 需要把表头加回去
    head -n 1 "$DATA_FILE" | cat - "$TEMP_EDIT_FILE" > temp && mv temp "$TEMP_EDIT_FILE"
    mv "$TEMP_EDIT_FILE" "$DATA_FILE"
    echo "学号为 '$student_id' 的学生成绩已删除。"
}

# 修改成绩信息
modify_grade() {
    echo "--- 修改学生成绩 ---"
    read -p "请输入要修改成绩的学生的学号: " student_id
    local line_to_modify
    line_to_modify=$(awk -F, -v id_col="$ID_COL" -v id="$student_id" '$id_col == id' "$DATA_FILE")
    if [ -z "$line_to_modify" ]; then
        echo "错误：未找到学号为 '$student_id' 的学生。"
        return
    fi
    echo "找到学生，当前信息为:"
    echo "$line_to_modify"
    echo "请输入新的信息 (若某项不想修改，请直接按回车键):"
    local old_values_array
    local new_values_array=()
    IFS=',' read -r -a old_values_array <<< "$line_to_modify"
    
    # 填充新数组，学号保持不变
    for (( i=0; i<ID_COL-1; i++ )); do
      new_values_array+=("${old_values_array[$i]}")
    done
    new_values_array+=("$student_id") # 确保学号不变

    # 从姓名列开始让用户修改
    for (( i=NAME_COL-1; i<${#HEADERS[@]}; i++ )); do
        clean_header=$(echo "${HEADERS[$i]}" | sed 's/ *\[.*\]//' | tr -d '\r')
        read -p "新的 '${clean_header}' (原: ${old_values_array[$i]}): " input_val
        if [ -z "$input_val" ]; then
            new_values_array+=("${old_values_array[$i]}")
        else
            new_values_array+=("$input_val")
        fi
    done
    new_record_line=$(IFS=,; echo "${new_values_array[*]}")
    
    # 使用 sed 和特定分隔符来替换行，以避免 new_record_line 中包含斜杠导致错误
    sed -i "s|^${student_id},.*|${new_record_line}|" "$DATA_FILE"
    echo "学号 '$student_id' 的成绩信息修改成功。"
}

# 2. 查询某学生各科成绩、总分、平均分
query_student() {
    echo "--- 查询学生成绩 ---"
    read -p "请输入要查询的学生的学号: " student_id
    local student_line
    student_line=$(awk -F, -v id_col="$ID_COL" -v id="$student_id" '$id_col == id' "$DATA_FILE")
    if [ -z "$student_line" ]; then
        echo "未找到学号为 '$student_id' 的学生。"
        return
    fi
    echo "查询结果:"
    local values_array
    IFS=',' read -r -a values_array <<< "$student_line"
    echo "$(echo ${HEADERS[$((ID_COL-1))]} | tr -d '\r'): ${values_array[$((ID_COL-1))]}"
    echo "$(echo ${HEADERS[$((NAME_COL-1))]} | tr -d '\r'): ${values_array[$((NAME_COL-1))]}"
    echo "--- 各科成绩 ---"
    local total_score=0
    local subject_count=0
    for (( i=SUBJECT_START_COL-1; i<${#HEADERS[@]}; i++ )); do
        local score_text="${values_array[$i]}"
        local score_num=$(grade_to_numeric "$score_text")
        local header_text=$(echo "${HEADERS[$i]}" | sed 's/ *\[.*\]//' | tr -d '\r')
        echo "${header_text}: $score_text"
        # 使用 bc 进行浮点数加法
        total_score=$(echo "$total_score + $score_num" | bc)
        subject_count=$((subject_count + 1))
    done
    local average_score=0
    if [ "$subject_count" -gt 0 ]; then
        average_score=$(echo "scale=2; $total_score / $subject_count" | bc)
    fi
    echo "--- 统计 ---"
    echo "总分 (根据可计算科目): $total_score"
    echo "平均分 (根据可计算科目): $average_score"
}

# 3. 按某科成绩、总分、平均分进行排序显示
sort_data() {
    echo "--- 成绩排序显示 ---"
    echo "请选择排序依据:"
    echo "1. 总分"
    echo "2. 平均分"
    local subject_start_display_index=3
    local subject_cols=()
    for (( i=SUBJECT_START_COL-1; i<${#HEADERS[@]}; i++ )); do
        clean_header=$(echo "${HEADERS[$i]}" | sed 's/ *\[.*\]//' | tr -d '\r')
        echo "$subject_start_display_index. 按 '${clean_header}' 排序"
        subject_cols+=($((i+1)))
        subject_start_display_index=$((subject_start_display_index + 1))
    done
    read -p "请输入选项: " sort_choice

    local temp_sort_file="temp_sort.csv"
    
    awk -F, '
    function grade_to_num(grade_str,   numeric_val) {
        if (grade_str ~ /优秀|优/) { numeric_val = 95 }
        else if (grade_str ~ /良好|良/) { numeric_val = 85 }
        else if (grade_str ~ /中等|中/) { numeric_val = 75 }
        else if (grade_str ~ /及格|及/) { numeric_val = 65 }
        else if (grade_str ~ /不及格/) { numeric_val = 55 }
        else if (grade_str ~ /^[0-9]+(\.[0-9]+)?$/) { numeric_val = grade_str }
        else { numeric_val = 0 }
        return numeric_val
    }
    NR > 1 {
        total = 0;
        count = 0;
        for (i = '$SUBJECT_START_COL'; i <= NF; i++) {
             current_score = grade_to_num($i);
             total += current_score;
             count++;
        }
        average = (count > 0) ? (total / count) : 0;
        print $0 "," total "," average;
    }' "$DATA_FILE" > "$temp_sort_file"

    local sort_key_col
    local original_col_count=${#HEADERS[@]}
    local header_line=$(head -n 1 "$DATA_FILE")

    case "$sort_choice" in
        1) sort_key_col=$((original_col_count + 1)); echo "按总分降序显示:";;
        2) sort_key_col=$((original_col_count + 2)); echo "按平均分降序显示:";;
        *)
            if [[ "$sort_choice" -ge 3 && "$sort_choice" -lt "$subject_start_display_index" ]]; then
                sort_key_col=${subject_cols[$((sort_choice-3))]}
                clean_header=$(echo "${HEADERS[$((sort_key_col-1))]}" | tr -d '\r')
                echo "按 '${clean_header}' 降序显示 (注意: 文字等级按字典序):"
                (echo "$header_line" && tail -n +2 "$DATA_FILE" | sort -t',' -k${sort_key_col},${sort_key_col}r) | column -s, -t | less -S
                rm -f "$temp_sort_file"
                return
            else
                echo "无效选项。"
                rm -f "$temp_sort_file"
                return
            fi
            ;;
    esac
    
    (echo "$header_line,总分,平均分" && sort -t',' -k${sort_key_col},${sort_key_col}nr "$temp_sort_file") | column -s, -t | less -S
    rm -f "$temp_sort_file"
}

# 4. 快速挑选查询出特定同学
advanced_search() {
    echo "--- 快速筛选查询 ---"
    echo "1. 按姓名模糊查询"
    echo "2. 按任意科目特定成绩查询"
    read -p "请输入选项: " search_type

    if [[ "$search_type" == "1" ]]; then
        read -p "请输入姓名关键字: " name_pattern
        echo "--- 姓名模糊匹配结果 ---"
        (head -n 1 "$DATA_FILE"; awk -F, -v name_col="$NAME_COL" -v pattern="$name_pattern" 'NR>1 && $name_col ~ pattern' "$DATA_FILE") | column -s, -t | less -S
    elif [[ "$search_type" == "2" ]]; then
        read -p "请输入要查询的特定成绩: " target_score
        echo "--- 特定科目成绩查询结果 ---"
        (head -n 1 "$DATA_FILE"; awk -F, -v score="$target_score" '
        NR > 1 {
            for (i = '$SUBJECT_START_COL'; i <= NF; i++) {
                if ($i == score) {
                    print $0;
                    next;
                }
            }
        }' "$DATA_FILE") | column -s, -t | less -S
    else
        echo "无效选项。"
    fi
}

while true; do
    echo -e "\n=============== 成绩管理系统 (Shell版) ==============="
    echo "1. 添加学生成绩"
    echo "2. 删除学生成绩"
    echo "3. 修改学生成绩"
    echo "4. 查询指定学生详情"
    echo "5. 按条件排序显示"
    echo "6. 快速筛选查询"
    echo "0. 退出系统"
    read -p "请输入你的选择 [0-6]: " choice

    case $choice in
        1) add_grade ;;
        2) delete_grade ;;
        3) modify_grade ;;
        4) query_student ;;
        5) sort_data ;;
        6) advanced_search ;;
        0) echo "感谢使用，系统已退出。"; exit 0 ;;
        *) echo "无效输入，请输入0-6之间的数字。" ;;
    esac
    read -n 1 -s -r -p "按任意键返回主菜单..."
    echo ""
done
